package com.xuwang.service.impl;

import com.xuwang.pojo.GovernmentStaff;
import com.xuwang.mapper.GovernmentStaffMapper;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.*;

/**
 * 政府工作人员基本信息表(GovernmentStaff)表服务实现类
 *
 * @author yuepeng
 * @since 2021-09-13 09:42:18
 * @version 1.0
 */
@Service("governmentStaffService")
public class GovernmentStaffServiceImpl {
    @Resource
    private GovernmentStaffMapper governmentStaffMapper;

    /**
     * 根据模糊条件查询总个数
     *
     * @param staffName 查询条件
     * @return 返回查询到的总个数
     */
    public Map<String, Object> selectForCount(String staffName, String departmentName, String personalPhone) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.governmentStaffMapper.selectForCount(staffName,departmentName,personalPhone));
        return map;
    }

    /**
     * 查询所有数据
     * @return  返回所有数据
     */
    public Map<String, Object> selectAll() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.governmentStaffMapper.selectAll());
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    public Map<String, Object> selectById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.governmentStaffMapper.selectById(id));
        return map;
    }

    /**
     * 查询分页数据
     *
     * @param index 查询起始位置
     * @param limit 每页条数
     * @param staffName  查询条件
     * @return 对象列表
     */
    public Map<String, Object> selectForPage( String staffName, String departmentName, String personalPhone, int index, int limit) {
    // 获取当前表中的总记录
        int tableCount = this.governmentStaffMapper.selectForCount(staffName,departmentName,personalPhone);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / limit + 1;
        // 计算每页开始的下标值
        index = (index - 1) * limit;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 查询的记录总页码
        map.put("count", tableCount);     // 当前表中的总条数
        map.put("data", this.governmentStaffMapper.selectForPage(staffName, departmentName, personalPhone, index, limit));
        return map;
    }

    /**
     * 新增数据
     *
     * @param governmentStaff 实例对象
     * @return 实例对象
     */
    public Map<String, Object> insert(GovernmentStaff governmentStaff){
        this.governmentStaffMapper.insert(governmentStaff);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "新增成功");
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param governmentStaff 实例对象
     * @return 实例对象
     */
    public Map<String, Object> updateById(GovernmentStaff governmentStaff) {
        this.governmentStaffMapper.updateById(governmentStaff);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "更新成功");
        return map;
    }
    /**
     * 通过ID查询单条数据
     *
     * @param id 主键id
     * @return 实例对象
     */
    public Map<String, Object> updateAccessoryById(Integer id, MultipartFile file, HttpServletRequest request) throws IOException {

        Map<String, Object> map = new HashMap<>();
        String abPath = "upload";
        String uploadPath = request.getServletContext().getRealPath("") + File.separator + abPath + File.separator;   // 得到相当项目工程的硬盘物理地址
        String fileName = file.getOriginalFilename();                   // 获取上传的文件名
        File newFile = new File(uploadPath + fileName);         // 根据当前工程的物理路径+文件名生成一个file对象
        System.out.println("newFile=" + newFile);
        FileCopyUtils.copy(file.getBytes(), newFile);                   // 通过上传通道中的字节码完成file文件的写入操作
        String accessory = File.separator + abPath + File.separator + fileName;  // 组装一个浏览器识别的文件地址
        System.out.println("header=" + accessory);
        this.governmentStaffMapper.updateAccessoryById(accessory,id);
        map.put("code", 200);
        map.put("msg", "上传头像成功");
        map.put("data", accessory);
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */

    public Map<String, Object> deleteById(String id) {
        String[] idArray = id.split(",");
        List<String> list = new ArrayList<>();
        list.addAll(Arrays.asList(idArray));
        this.governmentStaffMapper.deleteById(list);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "删除成功");
        return map;
    }
}
